//
//  VROauthViewController.swift
//  Sina_MicoBlog
//
//  Created by Lee on 16/5/13.
//  Copyright © 2016年 Lee.C. All rights reserved.
//当控制器跳转过来modal过来以后,我们就要在loadView的时候将这个UIView的view替换成webView,这个webView就需要懒加载了.然后这个webView就不用添加上去了.
//然后设置导航栏上面的按钮,
//设置完这些以后,我们用webView的方法,接受那个登录的界面链接.这个链接,我们就需要在网上拿到,这个方法是需要一个request的.然后我们拼接字符串
//一些常量,我们是需要创建一个常量类来拿到,也就是宏,创建在appDelegate的旁边
//注意,在访问网络的时候一定要配置好网络ATC*******
//发现有bug当点弹出键盘的时候再点取消的话会卡一下,所以我们先取消第一响应者.
//导入头文件,设置指示器的第三方,当加载loadrequest的时候就给个指示,然后webView里面是有一个代理方法,当加载完毕以后就会调用的.
//还有一个代理方法,是当网页加载数据的时候回调用这个方法,并且会有一个参数是request,里面有一个URL的属性,可以拿到当前加载的请求的URL.他返回一个bool值,作用是让不然加载  ****注意,url有个绝对路径的absoluteString.才能拿到has
//然后思路是,当加载的是新浪的request的时候,就让他加载,当加载的是baidu开头的就不让他加载了.也就是说不等于baidu就让加载.
//然后baidu的时候,点成功的时候就会有code=后面的,等取消就会有打印错误信息.
//url.query就是问号后面的(http://www.baidu.com/?code=a81a134ca87ec3825fe8e604fdcdbdf4)
//然后我们截取code,然后判断,当query是code=的才执行下面代码,不是的话就是按了取消按钮,然后关闭模态.
//****这里注意****,代理是准守代理,还要指定代理方法

//***拿到code以后,我们就需要用post请求数据了,平哥用MVVM,在VM里面创建方法,给Oauth控制器调用来获取***token**数据

//从VRAccountViewMode回来这边实现loadAccountToken方法.
//当error不等于空的时候,打印出现错误,指示器要显示你的网速不给力,然后一秒之后关闭,******延迟一秒的方法要参照一下oc的来写.
//等于空的时候,就没有错误,直接dismiss这个控制器了.


import UIKit
import SVProgressHUD

//这个是延展分类.


class VROauthViewController: UIViewController {
    
    override func loadView() {
        view = webView
    }
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //设置导航栏上的按钮,标题
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "填充", style: UIBarButtonItemStyle.Plain, target: self, action: "leftBtnAction")
        navigationItem.rightBarButtonItem  = UIBarButtonItem(title: "取消", style: UIBarButtonItemStyle.Plain, target: self, action: "rightBtnAction")
        navigationItem.title = "登录"
        //接收请求
        let URLString = OauthURL + "?client_id=" + client_id + "&redirect_uri=" + redirect_uri
        print(URLString)
        let webURl = NSURL(string: URLString)
        let webRequest =  NSURLRequest(URL: webURl!)
        webView.loadRequest(webRequest)
        SVProgressHUD.showWithStatus("正在加载")
        webView.delegate = self
    }

    
    //MARK: - 导航栏的按钮方法
   @objc private func leftBtnAction(){
        print("你点击了填充")
        let jsString = "document.getElementById('userId').value='guang9001@163.com';document.getElementById('passwd').value='281511615';"
        webView.stringByEvaluatingJavaScriptFromString(jsString)
    }
   @objc private func rightBtnAction(){
        
        print("你点击了导航栏的取消")
    //取消第一响应者.
    SVProgressHUD.dismiss()
        webView.endEditing(false)
        dismissViewControllerAnimated(true, completion: nil)
        
    }
  
    //MARK: - 懒加载
    lazy var webView: UIWebView = UIWebView()
}
        //MARK: -  webView的代理方法
extension VROauthViewController: UIWebViewDelegate{
    //加载完毕以后就会调用这个方法了
    func webViewDidFinishLoad(webView: UIWebView) {
        SVProgressHUD.dismiss()
    }
    
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        
        let url = request.URL!
        if !url.absoluteString.hasPrefix(redirect_uri){
        
            return true
        }else {
        
            let codeString = "code="
            let query = url.query!
            
            if query.hasPrefix(codeString) {
                let code = (query as NSString).substringFromIndex(codeString.characters.count)
            print(code)
              VRAccountViewModel.sharedInstance.loadAccessToken(code, callback: { (error) -> () in
                if error != nil{
                
                print("出现了错误")
                    
                SVProgressHUD.showErrorWithStatus("你的网络不给力")
                  dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(Int64)(1 * NSEC_PER_SEC)),dispatch_get_main_queue(), { () -> Void in
                    self.rightBtnAction()
                  })
                }else{
                //没有错
                    self.rightBtnAction()
                }
              })
       
            }else{
            //当加载query不是code的,只有点击了取消,所以else可以是关闭模态.
            rightBtnAction()
            
            }
            
        }
        return false
    }

}